cmake_minimum_required(VERSION 3.10)
project(server_framework VERSION 1.0.0 LANGUAGES CXX)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 设置构建类型
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

# 编译选项
add_compile_options(
    # -Wall: 启用所有常见的警告
    -Wall

    # -Wextra: 启用额外的警告选项
    # 包括一些 -Wall 未涵盖的警告，如：
    # - 未使用的参数
    # - 有符号和无符号类型的比较
    # - 虚函数的重写声明等
    -Wextra

    # -Werror: 将所有警告视为错误
    # 这确保代码必须解决所有警告才能成功编译
    -Werror

    # Debug 模式下的编译选项
    # -g: 生成调试信息，便于使用 GDB 等调试器
    $<$<CONFIG:Debug>:-g>

    # Release 模式下的编译选项
    # -O3: 启用最高级别的优化
    # 这会增加编译时间，但会生成运行速度最快的代码
    $<$<CONFIG:Release>:-O3>

    # 可以根据需要添加更多编译选项，例如：
    # -fPIC: 生成位置无关代码
    # -march=native: 针对本地CPU架构优化
    # -pthread: 启用多线程支持
)

# 查找依赖包
find_package(Threads REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(spdlog REQUIRED)

# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# 收集源文件
file(GLOB_RECURSE SOURCES 
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*/*.cpp"
)

# 收集头文件
file(GLOB_RECURSE HEADERS 
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.hpp"
)

# 添加头文件目录
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${OPENSSL_INCLUDE_DIR}
    ${spdlog_INCLUDE_DIRS}
)

# 创建可执行文件
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})

# 链接依赖库
target_link_libraries(${PROJECT_NAME}
    PRIVATE
        Threads::Threads
        ${OPENSSL_LIBRARIES}
        spdlog::spdlog
        pthread
)

# 安装规则
install(TARGETS ${PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

# 安装头文件
install(FILES ${HEADERS}
    DESTINATION include/${PROJECT_NAME}
)

# 添加测试支持（可选）
option(BUILD_TESTS "Build tests" OFF)
if(BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif() 